Skip to main content

20 加速运算

超线程

超线程(Hyper-Threading):同时运行多个程序。两个程序的指令完全独立,没有依赖关系。

把一个物理层面 CPU 核心,做成两个逻辑层面的 CPU 核心。在硬件层面增加电路,在一个 CPU 核心内部,维护两个不同线程的指令的状态信息。

一个线程的指令在流水线里停顿的时,另一个线程去执行指令。CPU 的译码器和 ALU 同时只能执行一个流水线指令。两个线程里的指令没有关联和依赖。

比较实用的特定应用场景:

  1. 需要应对很多请求的数据库应用
  2. 各个指令都要等待访问内存数据

SIMD 加速矩阵乘法

$ python
>>> import numpy as np
>>> import timeit
>>> a = list(range(1000))
>>> b = np.array(range(1000))
>>> timeit.timeit("[i + 1 for i in a]", setup="from __main__ import a", number=1000000)
32.82800309999993
>>> timeit.timeit("np.add(1, b)", setup="from __main__ import np, b", number=1000000)
0.9787889999997788
>>>

循环算法:单指令单数据(Single Instruction Single Data,SISD)处理方式

向量操作:单指令多数据流(Single Instruction Multiple Data,SIMD)处理方式

多核 CPU:多指令多数据(Multiple Instruction Multiple Dataa)

SIMD 在获取数据和执行指令时做到了并行,从内存里取数据时一次性取多个数据。

在计算层面存在大量数据并行(Data Parallelism)的计算中 SIMD 提升性能很多。

大量的数据并行,就是向量运算或者矩阵运算。实际程序开发中,多用在图片、视频、音频的处理和机器学习算法的计算。